home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / plain / contrib / cellular / cell4.tex < prev    next >
Encoding:
Text File  |  1989-11-22  |  10.1 KB  |  356 lines

  1. % File:       TeX Inputs Cell4.tex
  2. % Author:     J E Pittman
  3. % Bitnet:     JEPTeX@TAMVenus
  4. % Internet:   JEPTeX@Venus.TAMU.EDU
  5. % Date:       November 8, 1988
  6. %
  7. % Set up to output the data.
  8. %
  9. \catcode`_=11 % Protect local control sequence names.
  10. %
  11. % The user supplied information about the column has already been 
  12. % processed.
  13. %
  14. \def\column #1{\relax\ignorespaces}%
  15. %
  16. \row_number=0
  17. \rowpenalty=0
  18. %
  19. % This routine is used for horizontal kerning when there might be a 
  20. % kern to the left of the current position.
  21. %
  22. \def\move_right_via_lastkern #1{\relax
  23.    \temp_dimen=#1\relax
  24.    \ifdim \lastkern>\zeropt
  25.       \advance \temp_dimen \by \lastkern
  26.       \unkern
  27.    \else
  28.    \fi
  29.    \kern \temp_dimen
  30.    }%
  31. %
  32. % \row begins a row by getting its specifications, terminating the 
  33. % previous row (if any) and going into horizontal mode.
  34. %
  35. \def\row #1{\relax
  36.    \advance \row_number \by 1
  37.    \everyrow
  38.    \get_row_number_data
  39.    \advance \rowheight \by \expansion
  40.    \ifdim \bottomrulewidth>\zeropt
  41.       \advance \bottomrulewidth \by \horizontal_rule_adjust
  42.    \fi
  43.    \column_number=0
  44.    \par
  45.    \ifnum \rowpenalty=0
  46.    \else
  47.       \penalty \rowpenalty
  48.       \rowpenalty=0
  49.    \fi
  50.    \noindent
  51.    \ignorespaces
  52.    \message{Outputting row \the\row_number.}%
  53.    }%
  54. %
  55. % \blank creates a blank cell by kerning the appropriate amount.
  56. %
  57. \def\blank {\relax
  58.    \advance \column_number \by 1
  59.    \everycolumn
  60.    \get_column_number_data
  61.    \advance \columnwidth \by \expansion
  62.    \advance \merge_width \by \expansion
  63.    \move_right_via_lastkern \merge_width
  64. %
  65. % Terminate merger(s).
  66. %
  67.    \merge_width=\zeropt
  68.    \merge_columns=0
  69.    \ifnum \merge_rows>0
  70.       \add_column_number_data
  71.             {\merge_rows=0\relax\merge_height=\zeropt\relax}%
  72.    \fi
  73.    }%
  74. %
  75. % \cell outputs a cell.  The components of the cell are (in the order 
  76. % output) the entry, the top ruler, the bottom ruler, and the left and 
  77. % right rulers.
  78. %
  79. \def\cell #1{\relax
  80.    \advance \column_number \by 1
  81.    \everycolumn
  82.    \get_column_number_data
  83.    \advance \columnwidth \by \expansion
  84.    \advance \merge_height \by \rowheight
  85.    \advance \merge_width \by \columnwidth
  86.    \ifdim \leftrulewidth>\zeropt
  87.       \advance \leftrulewidth \by \vertical_rule_adjust
  88.    \fi
  89.    \ifdim \rightrulewidth>\zeropt
  90.       \advance \rightrulewidth \by \vertical_rule_adjust
  91.    \fi
  92. %
  93. % Get the correct top border skip and rule width.  Note that it is 
  94. % necessary to extract this informaion even if a row merger is not 
  95. % present because a previous row merger might have left the wrong 
  96. % values.
  97. %
  98.    \begingroup
  99.       \advance \row_number \by -\merge_rows
  100.       \everyrow
  101.       \get_row_number_data
  102.       \xdef\globaltemp{\topborderskip=\the\topborderskip\relax
  103.          \toprulewidth=\the\toprulewidth\relax
  104.          }%
  105.       \aftergroup \globaltemp
  106.       \endgroup
  107.    \ifdim \toprulewidth>\zeropt
  108.       \advance \toprulewidth \by \horizontal_rule_adjust
  109.    \fi
  110. %
  111. % Same procedure for the left border skip and rule width except that 
  112. % extraction is necessary only in the presense of a column merger due 
  113. % to the execution of an every column and a get at the start of \cell.  
  114. %
  115.    \ifnum \merge_columns>0
  116.       \begingroup
  117.          \advance \column_number \by -\merge_columns
  118.          \everycolumn
  119.          \get_column_number_data
  120.          \xdef\globaltemp{\leftrulewidth=\the\leftrulewidth\relax
  121.             \leftborderskip=\the\leftborderskip\relax
  122.             }%
  123.          \aftergroup \globaltemp
  124.          \endgroup
  125.       \ifdim \leftrulewidth>\zeropt
  126.          \advance \leftrulewidth \by \vertical_rule_adjust
  127.       \fi
  128.    \fi
  129. %
  130. % Typeset the entry into temp box horizontally first, trying kerns 
  131. % before glue in case the cell does not require horizontal stretching 
  132. % and taking advantage of an empty cell by doing nothing, if such is 
  133. % the case.
  134. %
  135.    \setbox\temp_box=\hbox{#1}%
  136.    \ifdim\wd\temp_box>\zeropt
  137.       \setbox\temp_box=\hbox \bgroup
  138.          \kern \leftborderskip
  139.          \box\temp_box
  140.          \egroup
  141.       \temp_dimen=\wd\temp_box
  142.       \advance\temp_dimen \by \rightborderskip
  143.       \wd\temp_box=\temp_dimen
  144. %
  145.       \ifdim\wd\temp_box=\merge_width
  146. %
  147. % then the kerns can be used instead of skips.
  148. %
  149.       \else
  150.          \setbox\temp_box=\hbox \to \merge_width \bgroup
  151.             \hskip \leftborderskip
  152.             #1%
  153.             \hskip \rightborderskip
  154.             \egroup
  155.       \fi
  156. %
  157. % Hide the width of temp box and put a phantom into it the hard way.
  158. %
  159.       \wd\temp_box=\zeropt
  160.       \setbox\scratch_box=\hbox{#1)}%
  161.       \ifdim \dp\scratch_box>\dp\temp_box
  162.          \dp\temp_box=\dp\scratch_box
  163.       \fi
  164.       \ifdim \ht\scratch_box>\ht\temp_box
  165.          \ht\temp_box=\ht\scratch_box
  166.       \fi
  167. %
  168.       \temp_dimen=\ht\temp_box
  169.       \advance \temp_dimen \by \dp\temp_box
  170.       \advance \temp_dimen \by \bottomborderskip
  171.       \advance \temp_dimen \by \topborderskip
  172.       \ifdim \temp_dimen=\merge_height
  173. %
  174. % then the entry can be positioned vertically via a raise statement.  
  175. % The total height of the material output should be equal to the row 
  176. % height, thus acting as a strut.
  177. %
  178.          \temp_dimen=\bottomborderskip
  179.          \advance \temp_dimen \by \dp\temp_box
  180.          \scratch_dimen=\rowheight
  181.          \advance\scratch_dimen by -\temp_dimen
  182.          \ht\temp_box=\scratch_dimen
  183.          \raise \temp_dimen \box\temp_box
  184.       \else % have to do it via a box
  185.          \setbox\temp_box=\vbox \to \rowheight \bgroup
  186. %
  187. % Subtracting merge height - row height from top border skip allows 
  188. % the cell to stick up into the next row by an appropriate amount.
  189. %
  190.             \advance \topborderskip \by \rowheight
  191.             \advance \topborderskip \by -\merge_height
  192.             \vskip \topborderskip
  193.             \box\temp_box
  194.             \vskip \bottomborderskip
  195.             \egroup
  196.          \box\temp_box
  197.       \fi
  198.    \fi
  199. %
  200. % All of the rules are typeset with an overlap of at least pixel width 
  201. % which insures that there will be no gaps.
  202. %
  203. % Typeset the top rule into an hbox and use a raise statement to put 
  204. % it into position.
  205. %
  206.    \ifdim \toprulewidth>\zeropt
  207.       \setbox\temp_box=\hbox \bgroup
  208.          \temp_dimen=\merge_width
  209.          \ifdim \half\leftrulewidth<\pixelwidth
  210.             \kern -\pixelwidth
  211.          \else
  212.             \kern -\half\leftrulewidth
  213.          \fi
  214.          \advance \temp_dimen \by -\lastkern
  215.          \vrule \height \half\toprulewidth
  216.                 \depth  \half\toprulewidth
  217.                 \width  \temp_dimen
  218.          \ifdim \half\rightrulewidth<\pixelwidth
  219.             \temp_dimen=\pixelwidth
  220.          \else
  221.             \temp_dimen=\half\rightrulewidth
  222.          \fi
  223.          \kern -\temp_dimen
  224.          \vrule \height \half\toprulewidth
  225.                 \depth  \half\toprulewidth
  226.                 \width  2\temp_dimen
  227.          \egroup
  228.       \wd\temp_box=\zeropt
  229.       \temp_dimen=\rowheight
  230.       \advance\temp_dimen \by -\merge_height
  231.       \ht\temp_box=\temp_dimen
  232.       \dp\temp_box=\merge_height
  233.       \raise \merge_height \box\temp_box
  234.    \fi
  235. %
  236. % Output the bottom rule using the same methods.
  237. %
  238.    \ifdim \bottomrulewidth>\zeropt
  239.       \setbox\temp_box=\hbox \bgroup
  240.          \temp_dimen=\merge_width
  241.          \ifdim \half\leftrulewidth<\pixelwidth
  242.             \kern -\pixelwidth
  243.          \else
  244.             \kern -\half\leftrulewidth
  245.          \fi
  246.          \advance \temp_dimen \by -\lastkern
  247.          \vrule \height \half\bottomrulewidth
  248.                 \depth  \half\bottomrulewidth
  249.                 \width  \temp_dimen
  250.          \ifdim \half\rightrulewidth<\pixelwidth
  251.             \temp_dimen=\pixelwidth
  252.          \else
  253.             \temp_dimen=\half\rightrulewidth
  254.          \fi
  255.          \kern -\temp_dimen
  256.          \vrule \height \half\bottomrulewidth
  257.                 \depth  \half\bottomrulewidth
  258.                 \width  2\temp_dimen
  259.          \egroup
  260.       \wd\temp_box=\zeropt
  261.       \dp\temp_box=\zeropt
  262.       \ht\temp_box=\rowheight
  263.       \box\temp_box
  264.    \fi
  265. %
  266. % Test to see if the left inclusive-or right rule width is non-zero.
  267. %
  268.    \ifdim \leftrulewidth=\zeropt
  269.       \temp_dimen=\rightrulewidth
  270.    \else
  271.       \temp_dimen=\leftrulewidth
  272.    \fi
  273.    \ifdim \temp_dimen>\zeropt
  274.       \setbox\temp_box=\hbox \bgroup
  275.          \temp_dimen=\merge_height
  276.          \advance \merge_height \by \pixelwidth
  277.          \ifdim \leftrulewidth>\zeropt
  278.             \kern -\half\leftrulewidth
  279.             \vrule \height \temp_dimen
  280.                    \depth  \pixelwidth
  281.                    \width  \leftrulewidth
  282.          \fi
  283.          \ifdim \rightrulewidth>\zeropt
  284.             \scratch_dimen=\merge_width
  285.             \advance \scratch_dimen \by -\half\leftrulewidth
  286.             \advance \scratch_dimen \by -\half\rightrulewidth
  287.             \kern \scratch_dimen
  288.             \vrule \height \temp_dimen
  289.                    \depth  \pixelwidth
  290.                    \width  \rightrulewidth
  291.          \fi
  292.          \egroup
  293.       \wd\temp_box=\merge_width
  294.       \ht\temp_box=\rowheight
  295.       \dp\temp_box=\zeropt
  296.       \box\temp_box
  297.    \else
  298.       \move_right_via_lastkern \merge_width
  299.    \fi
  300. %
  301. % Cancel the mergers.
  302. %
  303.    \merge_width=\zeropt
  304.    \merge_columns=0
  305.    \ifnum \merge_rows>0
  306.       \add_column_number_data
  307.             {\merge_rows=0\relax\merge_height=\zeropt\relax}%
  308.    \fi
  309.    \ignorespaces
  310.    }%
  311. %
  312. % No surprises here.
  313. %
  314. \def\mergeright {\relax
  315.    \advance \column_number \by 1
  316.    \everycolumn
  317.    \get_column_number_data
  318.    \advance \columnwidth \by \expansion
  319.    \advance \merge_width \by \columnwidth
  320.    \advance \merge_columns \by 1
  321.    \ifnum \merge_rows>0
  322.       \add_column_number_data
  323.             {\merge_rows=0\relax\merge_height=\zeropt\relax}%
  324.    \fi
  325.    }%
  326. %
  327. % No surprises here.
  328. %
  329. \def\mergedown {\relax
  330.    \advance \column_number \by 1
  331.    \everycolumn
  332.    \get_column_number_data
  333.    \advance \columnwidth \by \expansion
  334.    \advance \merge_width \by \columnwidth
  335.    \move_right_via_lastkern \merge_width
  336.    \merge_width=\zeropt
  337.    \merge_columns=0
  338.    \advance \merge_height \by \rowheight
  339.    \let\info=\relax
  340.    \edef\temp{\the\column_number>\info
  341.          {\merge_height=\the\merge_height\relax
  342.          \advance\merge_rows \by 1\relax}}%
  343.    \let\info=\column_info
  344.    \x_after \add_data \temp
  345.    \rowpenalty=10000 % do not allow a break over a row merge.
  346.    }%
  347. %
  348. \catcode`_=8 % Back to normal.
  349. %
  350. \def\noalign#1{\relax
  351.    \vadjust{#1}%
  352.    \ignorespaces
  353.    }%
  354. %
  355. \endinput
  356.